Introducción

Esta breve guía describe el procedimiento de configuración del sistema formado por la Raspberry Pi (en su variante 3B+ o 4) y la placa de entrada salida Bee v2.0, para la realización de prácticas de la asignatura “Arquitectura Interna de Linux y Android”. Esencialmente, para preparar este entorno de prácticas deben realizarse los siguientes pasos:

  1. Configuración hardware de placa de entrada-salida (“Bee v2.0”) para realización de prácticas
  2. Configuración inicial de la máquina virtual y de la red interna para conexión con la Raspberry Pi
  3. Arranque por primera vez de la Raspberry Pi
  4. Prueba de conexión por SSH a la Raspberry Pi desde la máquina virtual
  5. Comprobación del funcionamiento de la placa de E/S y de su configuración
  6. Análisis de alternativas para desarrollo en la Raspberry Pi desde la máquina virtual. Configuración de VSCode.

Además del equipo con la máquina virtual instalada, y de la Raspberry Pi conectada a la placa de E/S, se requiere disponer del siguiente material para la realización de los distintos pasos:

  • Scripts de comprobación de conexiones de la placa Bee: Se encuentran en el directorio TestBee de los ficheros de ejemplo proporcionados con la práctica 3 de LIN.

  • Tarjeta SD de 16GB: Esta tarjeta –proporcionada junto con el resto del material– tiene instalada una imagen custom de Raspberry Pi OS para la asignatura.

    • Nota importante: Si el sistema instalado se corrompiera por alguna causa durante la realización de las prácticas, la imagen se ha de restaurar. El fichero de imagen (raspberry-pi-os_030422.img) puede descargarse usando este enlace de Google Drive.

      Para la restauración de la imagen puede emplearse la aplicación gratuita multiplataforma balenaEtcher que puede descargarse aquí. La instalación de la imagen es un proceso muy sencillo. Basta seleccionar el fichero de imagen descargado previamente en nuestro equipo (fichero raspberry-pi-os_030422.img ) , escoger la unidad de la tarjeta SD de 16GB donde instalar la imagen (accesible mediante un lector de tarjetas SD), y finalmente hacer clic en Flash.

  • Cable USB TTL

  • Interfaz USB Ethernet

  • Cable Ethernet

  • 7 cables dupont hembra-hembra

  • Dos jumpers (o en su defecto dos cables dupont hembra-hembra adicionales para interconectar 4 pines de la placa Bee v2.0)

1 Configuración hardware de placa de entrada-salida (“Bee v2.0”) para realización de prácticas

La placa de E/S Bee v2.0 que se utilizará en las prácticas de la asignatura consta de una serie de circuitos desacoplados para la gestión de distintos dispositivos como LEDs, pulsadores, un zumbador (buzzer) pasivo, etc. Antes de proceder a arrancar la Raspberry Pi usando la imagen del sistema operativo instalado en la tarjeta SD es preciso realizar distintas conexiones entre pines específicos de la placa (GPIOs) y los pines de entrada o salida de los circuitos que controlan los distintos dispositivos a utilizar. Asimismo, es necesario conectar el cable USB TTL para poder visualizar la salida del puerto serie de la placa desde la máquina virtual de Debian.

La siguiente figura muestra los módulos de pines (J3, J4, J5, J6, J13 y J17) donde se realizarán las conexiones necesarias usando 7 cables dupont hembra-hembra y 2 jumpers (o, dos cables dupont extra, si no se dispone de jumpers).

 

El siguiente video ilustra cómo realizar las interconexiones de los pines que se requieren para las prácticas:

2 Configuración inicial de la máquina virtual y de la red interna

En este paso procederemos a arrancar la máquina virtual de Debian VMWare, y realizaremos la configuración mínima necesaria para poder conectarnos a la Raspberry Pi desde la máquina virtual de distintas formas.

Tras finalizar el proceso de arranque iniciaremos sesión con el usuario kernel y contraseña kernel.

Recordad que la cuenta de usuario tiene “permisos de sudo”. Para ejecutar un comando como root, cuando sea preciso, se ha de hacer lo siguiente:

y teclear la contraseña del usuario en cuestión (no la de root) cuando la solicite.

Para abrir un shell de root, debemos usar el siguiente comando:

2.1 Conexión de dispositivos USB a la máquina virtual

Para poder acceder vía Ethernet y vía puerto serie a la Raspberry Pi desde la máquina virtual, es preciso ahora conectar la interfaz Ethernet USB y el cable USB TTL a nuestro equipo. La interfaz Ethernet debe estar conectada usando un cable Ethernet a la Raspberry Pi, y el cable USB TTL también debe estar conectado a la placa tal y como se mostró en el video descriptivo.

Al conectar ambos dispositivos USB a nuestro equipo, los dispositivos deberían listarse correctamente en la entrada de menú “USB & Bluetooth” de VMWare, tal y como se muestra en la siguiente imagen:

configuracion_usb1 

En la captura de pantalla, la interfaz Ethernet conectada figura como “ASIX AX88772B” (el modelo de la interfaz proporcionado con el material de laboratorios podría ser diferente), y el cable USB TTL como “Future Devices TTL232R-3V3”. Para que la máquina virtual tenga el control de ambos dispositivos es necesario hacer clic en la entrada de menú con etiqueta “Connect …” para los dos dispositivos. Al hacer esto, el menú “USB & Bluetooth” debería mostrar ahora la etiqueta “Disconnect …” para ambos dispositivos:

configuracion_usb2 

Procederemos ahora a comprobar si el dispositivo /dev/ttyUSB0 está presente, lo cual indicará que el cable USB TTL ha sido reconocido adecuadamente por el sistema Debian. Para ello, abriremos una ventana de terminal dentro de la máquina virtual y ejecutaremos el siguiente comando:

Para verificar que la interfaz de red USB se ha reconocido correctamente ejecutaremos el comando ip a , que debería listar tres interfaces de red: loopback (lo), la interfaz ethernet de la propia máquina virtual (ens33) y, en último lugar, la interfaz USB Ethernet:

Llegados a este punto es crucial anotar el nombre asignado por Linux para la interfaz USB Ethernet conectada a nuestro equipo, ya que este nombre deberá almacenarse en dos ficheros que editaremos a continuación. Esto es preciso para configurar correctamente la red interna, por donde estableceremos comunicación con la Raspberry Pi. En particular, es preciso realizar lo siguiente:

  1. Efectuar las siguientes modificaciones en el fichero /etc/network/interfaces como root (p.ej.: sudo nano /etc/network/interfaces )

    • Descomentar las 4 últimas líneas del fichero, eliminando el símbolo “#” al principio de las 4 líneas:

    • Tras descomentar estas líneas, se ha de establecer el nombre asignado a la interfaz USB Ethernet en nuestro sistema en las dos primeras líneas de ese fragmento de texto. Así, por ejemplo, si el nombre de la interfaz USB Ethernet mostrado por ip a fuese “enx00001b3c7740”, las últimas 4 líneas del fichero /etc/network/interfaces deberían ser las siguientes:

      auto enx00001b3c7740
      iface enx00001b3c7740 inet static
      address 192.168.2.1
      netmask 255.255.255.0
  2. Editar el script /usr/local/bin/setup-network.sh como root (p.ej.: sudo nano /usr/local/bin/setup-network.sh )

Tras llevar a cabo estas modificaciones en los ficheros, procederemos a configurar la red interna ejecutando el script setup-network.sh con sudo:

Nota importante: Para establecer correctamente la configuración de la red interna, este script deberá ejecutarse manualmente siempre que se reinicie la máquina virtual (MV) de Debian, y siempre asegurándonos que la interfaz USB Ethernet está conectada a la MV.

3 Primer arranque de la Raspberry Pi

Si se han realizado correctamente todos los pasos hasta este punto, la máquina virtual debería está correctamente configurada, incluyendo la red interna para conexión con la Raspberry Pi. Procederemos entonces a iniciar una sesión serie con la Raspberry Pi (no arrancar aún) desde la máquina virtual, usando el programa minicom de la siguiente forma:

Esto abrirá la sesión serie de minicom:

En este preciso instante, arrancaremos la Raspberry Pi, y visualizaremos el proceso de arranque por la sesión serie de minicom. Nótese que el primer arranque de la placa puede tardar más de lo habitual (algunos minutos), ya que el sistema de ficheros de la partición raíz en la tarjeta SD está configurado para expandirse durante este primer arranque. Acabado el proceso de arranque, se mostrará el prompt de login a través del puerto serie:

Opcionalmente en este paso se puede realizar login (si se desea) a través del puerto serie utlizando las siguientes credenciales:

  • nombre de usuario: pi
  • Contraseña: raspberry

4 Prueba de conexión por SSH a la Raspberry Pi desde la máquina virtual

Considerando que la configuración de red se ha realizado correctamente, la Raspberry Pi debería ser accesible por SSH desde la máquina virtual utilizando la dirección IP estática 192.198.2.20, o alternativamente el nombre de host pi, que figura en el fichero /etc/hosts de la máquina virtual. A continuación se muestra el resultado de acceder por SSH a la Raspberry Pi la primera vez desde la máquina virtual (usuario: “pi”, contraseña: “raspberry”):

Para garantizar que la configuración de red es completamente funcional, comprobaremos que la Raspberry Pi tiene acceso a Internet, ejecutando el siguiente comando (a cancelar manualmente con CTRL+C):

5 Comprobación del funcionamiento de la placa de E/S y de su configuración

Concluiremos la preparación del entorno de trabajo comprobando que las conexiones realizadas en la placa Bee v2.0 (punto 1 de esta guía), son correctas, y que por tanto, los dispositivos correspondientes que se usarán en las prácticas (ver imagen a continuación) son completamente funcionales.

placa_main_comp  

Para realizar las comprobaciones pertinentes es preciso haber descargado primero los ficheros de la práctica 3 de LIN. Los comandos que se muestran a continuación asumen que el fichero TAR.GZ correspondiente se ha extraído en el directorio HOME del usuario kernel, por lo que existirá un directorio TestBee en su interior, donde podrán encontrarse cuatro scripts:

Estos scripts permiten controlar el estado del display 7 segmentos de la placa, modificar el estado de los LEDS D1-D3, reproducir notas musicales con el buzzer pasivo, y comprobar si el pulsador SW1 está o no pulsado, todo ello desde espacio de usuario. Cabe destacar que en las prácticas de este curso nos centraremos en el acceso a estos dispositivos desde el kernel Linux. Por lo tanto, se deja como ejercicio el estudio del código de los scripts proporcionados, donde se accede a todos estos dispositivos desde espacio de usuario.

Comenzaremos ejecutando el script ./leds_test.py. Si las conexiones se han realizado correctamente, el script encenderá y apagará alternativamente los tres LEDs de la placa Bee (D1, D2 y D3). La ejecución del script tendrá que cancelarse manualmente con CTRL+C, tras comprobar que los LEDs se apagan y enciencen alternativamente:

En segundo lugar probaremos el funcionamiento del pulsador SW1, que se encuentra debajo de los LEDs. El script ./button_test.py muestra periodicamente el estado del circuito del pulsador SW1, imprimiendo “Closed” cuando el pulsador no esté pulsado, y “Open” al mantener presionado el pulsador. De nuevo, la ejecución del script ha de interrumpirse manualmente con CTRL+C al finalizar la prueba:

Probaremos ahora el display 7 segmentos mediante el script 7sdisplay_test.py. Si las conexiones se han realizado correctamente, el script mostrará continuamente la secuencia hexadecimal de números 0,1,2,…, F. La ejecución del script tendrá que cancelarse tecleando CTRL+C:

Finalmente, se comprobará el funcionamiento del buzzer pasivo, mediante el script buzzer_test.sh. Este script configura el buzzer para la reproducción de la siguiente secuencia de notas: LA4, MI4 y LA4 (cada una de ellas durante un segundo). Este script, a diferencia de los anteriores, ha de ejecutarse con sudo:

6 Análisis de alternativas para desarrollo en la Raspberry Pi desde la máquina virtual. Configuración de VSCode.

Por motivos de rendimiento se aconseja almacenar en el directorio HOME del usuario pi –en la propia Raspberry Pi (tarjeta SD)– los ficheros fuente de los módulos del kernel a desarrollar en las prácticas. También es recomendable hacer copia de seguridad de los ficheros cada cierto tiempo transfiriéndolos al sistema host por red (p.ej., usando comando scp visto en clase). En este caso, usaremos el término “host” para referirnos a la máquina virtual de Debian, que es desde donde nos comunicaremos por red con la placa Raspberry Pi.

Conectarse a la placa por SSH desde la máquina virtual será algo muy frecuente durante la realización de las prácticas. Por este motivo, se aconseja configurar el acceso a la Raspberry Pi sin contraseña, es decir usando una clave SSH. Para establecer la configuración han de seguirse los siguientes pasos dentro de la máquina virtual:

  1. Si el fichero ~/.ssh/id_rsa.pub no existe, ha de crearse uno mediante el comando ssh-keygen -t rsa -b 2048. En nuestro caso teclearemos ENTER a continuación para aceptar la ruta por defecto del fichero, y NO establecer passphrase:

  2. Dar de alta la clave SSH generada en el registro del usuario pi dentro de la Raspberry Pi. Para ello haremos uso del comando ssh-copy-id como se muestra a continuación, y tecleando la contraseña del usuario (raspberry) cuando nos lo solicite:

  3. Llegados a este punto ya podremos conectarnos por SSH a la Raspberry Pi sin teclear la contraseña, y usando por debajo la clave SSH generada:

Existen esencialmente tres alternativas para desarrollar las prácticas sobre la Raspberry Pi, compilando los módulos del kernel desde la propia placa1. A continuación se describen las distintas opciones.

6.1 Opción 1: Ejecución del editor en la propia placa

Editar los ficheros con programa editor instalado en la propia placa, lanzando el editor por SSH. Pueden utilizarse para ello editores de línea de comandos (como vim o nano) o incluso editores gráficos como geany (esto exige activar la opción -X al conectarse por SSH: ssh -X pi@pi). La compilación debe llevarse a cabo desde un shell SSH dentro de la propia Raspberry Pi.

6.2 Opción 2: SSHFS y edición de ficheros desde el host

El sistema de ficheros de la Raspberry Pi se puede montar en el host (máquina virtual de Debian) por SSH usando el comando sshfs, como en el siguiente ejemplo:

kernel@debian:~$ mkdir home-raspberry
kernel@debian:~$ sshfs pi@pi:/home/pi home-raspberry
kernel@debian:~$ ls home-raspberry/
Bookshelf  Desktop    Downloads   Pictures   Videos
Documents  Music      Public    Templates

En el ejemplo se crea un directorio vacío home-raspberry (puede usarse el nombre que se desee), que se emplea como punto de montaje. Gracias al comando sshfs del ejemplo se monta el directorio HOME del usuario pi de la Raspberry en el directorio ~/home-raspberry del host. Una vez montada la carpeta por SSH se pueden editar los ficheros con cualquier editor en el host, ya sea por línea de comandos o gráficamente (p.ej., con Sublime Text o VSCode). SSHFS transfiere automáticamente los ficheros a la Raspberry cuando detecta cambios en los mismos, y sin requerir intervención del usuario.

Cuando se haya acabado de trabajar con los ficheros, o cuando se desee reiniciar o apagar la Raspberry Pi, se ha de desmontar la carpeta montada usando fusermount:

6.3 Opción 3: Uso de extensión Remote de VSCode para trabajar con Raspberry Pi de forma transparente

VSCode posee una extensión llamada Remote que permite trabajar con una o varias carpetas de un sistema accesible por SSH2 como si de una carpeta local se tratara. Una vez se ha establecido la conexión de VSCode con el sistema remoto, los terminales abiertos dentro del propio entorno se ejecutarán en la máquina a la que nos hemos conectado. Por lo tanto, cada terminal se corresponde con un shell SSH en la máquina target (la Raspberry Pi en nuestro caso). En definitiva, de esta forma tendremos la ilusión de que trabajamos con VSCode desde dentro del propio sistema target, pero usando el entorno gráfico del host de desarrollo.

La extensión Remote ya está instalada en la máquina virtual del laboratorio. No obstante, hemos de configurar dicha extensión para trabajar con la Raspberry Pi. Para ilustrar el proceso de configuración de Remote desde la máquina virtual se proporciona el vídeo mostrado a continuación. En el vídeo se asume que se ha habilitado el acceso por SSH sin contraseña (vía clave SSH) a la Raspberry Pi siguiendo las instrucciones mostradas más arriba.

Una vez que la Raspberry Pi se ha dado de alta como remote dentro de VSCode –como se ilustra en el vídeo–, dicho remote permanecerá registrado en futuras ejecuciones de VSCode. Por lo tanto, para trabajar con ficheros en la placa bastará abrir la carpeta deseada desde el explorador de Remotes.

Por último, se ha de tener presente que cuando hacemos uso de la extensión Remote, es necesario instalar las extensiones de VSCode que deseemos para desarrollar desde ese target al que nos conectamos. Para trabajar con la Raspberry Pi, se recomienda instalar las extensiones estándar de VSCode para desarollo C/C++. La instalación debe hacerse desde una ventana de Remote.


  1. También es posible almacenar, editar los ficheros, y compilar los módulos desde el sistema host, empleando compilación cruzada. Sin embargo esto conlleva copiar los .ko correspondientes a la placa para testear su funcionalidad.

  2. Este plugin de VSCode también soporta trabajar con WSL y contenedores Docker.